package work.linruchang.util;

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;

/**
 * 增强的二维码处理工具
 *
 * @author LinRuChang
 * @version 1.0
 * @date 2022/03/22
 * @since 1.8
 **/
public class EnhanceQrCodeUtil extends QrCodeUtil {

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题（结果图片的标题）
     * @param qrContent 二维码扫码后的内容  二维码为300*300
     * @param targetFile 生成的二维码放置的位置
     */
    public static void generate(String title, String qrContent, File targetFile) {
        generate(title,qrContent,null,targetFile);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题（结果图片的标题）
     * @param qrContent 二维码扫码后的内容  二维码为300*300
     * @param logoImage 二维码中间里面的图标
     * @param targetFile 生成的二维码放置的位置
     */
    public static void generate(String title, String qrContent, Image logoImage, File targetFile) {
        BufferedImage generate = generate(title, qrContent,logoImage);
        ImgUtil.write(generate, targetFile);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题（结果图片的标题）
     * @param qrContent 二维码扫码后的内容  二维码为300*300
     * @param out 目标流-结果图片放置到哪里
     */
    public static void generate(String title, String qrContent, OutputStream out) {
        generate(title,qrContent,null,out);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题（结果图片的标题）
     * @param qrContent 二维码扫码后的内容  二维码为300*300
     * @param logoImage 二维码中间里面的图标
     * @param out 目标流-结果图片放置到哪里
     */
    public static void generate(String title, String qrContent, Image logoImage, OutputStream out) {
        BufferedImage resultImage = generate(title, qrContent,logoImage);
        ImgUtil.write(resultImage, ImgUtil.IMAGE_TYPE_PNG, out);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     * @param out 目标流-结果图片放置到哪里
     */
    public static void generate(String title, String qrContent, int width, int height, OutputStream out) {
        generate(title,qrContent,width,height,ImgUtil.IMAGE_TYPE_PNG,out);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     * @param logoImage 二维码中间里面的图标
     * @param out 目标流-结果图片放置到哪里
     */
    public static void generate(String title, String qrContent, int width, int height, Image logoImage, OutputStream out) {
        BufferedImage resultImage = generate(title, qrContent, width, height,logoImage);
        ImgUtil.write(resultImage, ImgUtil.IMAGE_TYPE_PNG, out);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     * @param imageType 图片类型（图片扩展名），见{@link ImgUtil}
     * @param out 目标流-结果图片放置到哪里
     */
    public static void generate(String title, String qrContent, int width, int height, String imageType, OutputStream out) {
        generate(title,qrContent,width,height,null,imageType,out);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     * @param logoImage 二维码中间里面的图标
     * @param imageType 图片类型（图片扩展名），见{@link ImgUtil}
     * @param out 目标流-结果图片放置到哪里
     */
    public static void generate(String title, String qrContent, int width, int height, Image logoImage, String imageType, OutputStream out) {
        BufferedImage resultImage = generate(title, qrContent, width, height, logoImage,imageType);
        ImgUtil.write(resultImage, imageType, out);
    }


    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容  二维码图片300*300
     */
    public static BufferedImage generate(String title, String qrContent) {
        return generate(title,qrContent,300, 300, ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容  二维码图片300*300
     * @param logoImage 二维码中间里面的图标
     */
    public static BufferedImage generate(String title, String qrContent, Image logoImage) {
        return generate(title, qrContent, 300, 300, logoImage,ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     */
    public static BufferedImage generate(String title, String qrContent, int width, int height) {
        return generate(title,qrContent,width,height,ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     * @param logoImage 二维码中间里面的图标
     */
    public static BufferedImage generate(String title, String qrContent, int width, int height, Image logoImage) {
        return generate(title, qrContent, width, height, logoImage,ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 结果高度【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     * @param imageType 图片类型（图片扩展名），见{@link ImgUtil}
     */
    public static BufferedImage generate(String title, String qrContent, int width, int height, String imageType) {
        return generate(title,qrContent,width,height,null,imageType);
    }

    /**
     * 生成二维码到输出流（图片有标题显示）
     * @param title 二维码图片的标题
     * @param qrContent 二维码扫码后的内容
     * @param width 二维码图片宽度 - 最后结果图片的总宽度
     * @param height 二维码图片高度 - 非最后结果图片的总高度 - 结果高度【height+50(来自标题图片的高度，如果标题空则结果高度为height)】
     * @param logoImage 二维码中间里面的图标
     * @param imageType 图片类型（图片扩展名），见{@link ImgUtil}
     */
    public static BufferedImage generate(String title, String qrContent, int width, int height, Image logoImage, String imageType) {

        imageType = StrUtil.blankToDefault(imageType,ImgUtil.IMAGE_TYPE_PNG);

        //二维码图片
        BufferedImage resultImage = null;

        QrConfig qrConfig = new QrConfig(width, height);
        qrConfig.setMargin(1);
        qrConfig.setImg(logoImage);
        final BufferedImage qrImage = generate(qrContent, qrConfig);
        BufferedImage titleImage = null;

        //标题图片
        if(StrUtil.isNotBlank(title)) {
            titleImage = EnhanceImgUtil.createContentImage(title, width, 50);
        }

        try {
            resultImage = EnhanceImgUtil.mergeImage(qrImage,titleImage);
        }catch (Exception e) {
            Console.log("二维码图片合并发生异常【{},{}】：{}", title,qrContent, resultImage);
        }

        return resultImage;
    }


}
